package design

import "math"

//最小栈，可以在常数时间内，返回栈中的最小元素
type MinStack struct {
	val  int
	min  int
	next *MinStack
	head *MinStack
}

func NewMinStack() *MinStack {
	return &MinStack{}
}

//MinStack() 初始化堆栈对象。
//void push(int val) 将元素val推入堆栈。
//void pop() 删除堆栈顶部的元素。
//int top() 获取堆栈顶部的元素。
//int getMin() 获取堆栈中的最小元素。

func (s *MinStack) Push(val int) {
	node := new(MinStack)
	node.val = val
	node.min = val
	if s.head != nil {
		//计算栈中的最小值
		node.min = int(math.Min(float64(val), float64(s.head.min)))
		//头部插入
		node.next = s.head
	}
	s.head = node
}

func (s *MinStack) Pop() {
	if s.head == nil {
		return
	}
	head := s.head
	//断开链接
	s.head = head.next
	head.next = nil
}

func (s *MinStack) Top() int {
	if s.head != nil {
		return s.head.val
	}
	return 0
}

func (s *MinStack) GetMin() int {
	if s.head != nil {
		return s.head.min
	}
	return 0
}
